import { Modal } from 'ant-design-vue'

import { ResultEnum } from './enum'
import { isObject } from '@vueuse/core'

// 自定义请求 --- 响应拦截器
export function useAxiosResponse<T = any>(response: any): T | undefined {
  const { data } = response ?? {}
  if (!data) {
    // return '[HTTP] Request has no return value';
    throw new Error('请求出错，请稍候重试！')
  }

  //  这里 code，result，message为 后台统一的字段，需要在 types.ts内修改为项目自己的接口返回格式
  const { code, data: result, message } = data

  // 这里逻辑可以根据项目进行修改
  const hasSuccess =
    data && Reflect.has(data, 'code') && 200 <= code && code < 300
  if (hasSuccess) {
    return result
  }

  // 在此处根据自己项目的实际情况对不同的code执行不同的操作
  // 如果不希望中断当前请求，请return数据，否则直接抛出异常即可
  let timeoutMsg: string | string[] = message
  switch (code) {
    case ResultEnum.EMPOWER:
      timeoutMsg = '请求未授权,请重新登录!'
      break
    case ResultEnum.TIMEOUT:
      timeoutMsg = '请求超时,请重新登录!'
      break
    case ResultEnum.PAY:
      timeoutMsg = '该功能需要购买，请付费开通！'
      break
    case ResultEnum.FORBIDDEN:
      timeoutMsg = '当前用户无该功能权限，无法访问!	'
      break
    case ResultEnum.WEB_ERROR:
      timeoutMsg = message?.id
      break
    default:
      if (message) {
        if (isObject(message)) {
          const msg: string[] = []
          Object.values(message).forEach((value: any) => {
            if (Array.isArray(value)) {
              msg.push(...value)
            } else {
              msg.push(value.toString())
            }
          })
          timeoutMsg = msg
        } else {
          timeoutMsg = message
        }
      }
  }

  const errorMessage: string = Array.isArray(timeoutMsg)
    ? timeoutMsg.join(';\n')
    : timeoutMsg
  Modal.error({ title: '错误提示', content: errorMessage })
  throw new Error(errorMessage)
}
